package com.spmsys.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * token工具类
 */
public class Token {

    /**
     * 生成token方法
     *
     * @param username     用户名
     * @param password     密码
     * @param token_secret 密钥
     * @param expiration   过期时间
     * @return token
     */
    public static String token(String username, String password, String token_secret, Long expiration) {
        try {
            //过期时间
            Date date = new Date(System.currentTimeMillis() + (expiration != null ? expiration : (30L * 24 * 60 * 60 * 1000)));
            //秘钥及加密算法
            Algorithm algorithm = Algorithm.HMAC256(token_secret);
            //设置头部信息
            Map<String, Object> header = new HashMap<>() {{
                put("typ", "JWT");
                put("alg", "HS256");
            }};
            //携带userId，password信息，生成签名
            return JWT.create().withHeader(header).withClaim("userId", username).withClaim("password", password).withExpiresAt(date).sign(algorithm);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 校验token方法
     *
     * @param token        token
     * @param token_secret token密钥
     * @return 校验结果
     */
    public static @NotNull Boolean verify(String token, String token_secret) {
        try {
            Algorithm algorithm = Algorithm.HMAC256(token_secret);
            JWTVerifier jwtVerifier = JWT.require(algorithm).build();
            jwtVerifier.verify(token);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 通过token获取用户id方法
     *
     * @param token        token
     * @param token_secret token密钥
     * @return 用户id
     */
    public static @Nullable String getUserIdByToken(String token, String token_secret) {
        try {
            return JWT.require(Algorithm.HMAC256(token_secret)).build().verify(token).getClaim("userId").asString();
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 通过Token获取用户密码
     *
     * @param token        token
     * @param token_secret toke密钥
     * @return 用户密码
     */
    public static @Nullable String getPasswordByToken(String token, String token_secret) {
        try {
            return JWT.require(Algorithm.HMAC256(token_secret)).build().verify(token).getClaim("password").asString();
        } catch (Exception e) {
            return null;
        }
    }
}
